#!/bin/bash
# 文件名：select_removable_disk.sh
# 功能说明：
# 本脚本用于检测并列出系统中所有可移动磁盘设备（如 U 盘、外接硬盘等），
# 并提供交互式选择界面，允许用户选择一个磁盘设备。

# 实现方式：
# 1. 读取 /sys/block/*/removable 目录，筛选出所有标记为可移动的磁盘设备
# 2. 使用 lsblk 显示可移动磁盘的详细信息
# 3. 提示用户输入设备名称进行选择，并验证输入是否有效
#
# 适用范围：
# - 适用于 Linux 系统（依赖于 /sys/block 和 lsblk）
# - 适用于带有可移动存储设备（USB 盘、外部硬盘等）的系统
#
# 依赖：
# - 需要 `lsblk` 命令来获取设备信息
# - 需要对 `/sys/block` 具有读取权限
#
# 退出状态：
# - 0: 成功运行并选择了设备
# - 1: 没有找到可移动磁盘设备
#
# 使用方法：
# 直接运行脚本，它会检测可移动磁盘并提示选择：
#   ./select_removable_disk.sh
#
# 用户可以输入磁盘名称（如 sdb）进行选择，也可以直接回车退出程序。

# 获取所有可移动磁盘设备
get_removable_disks() {
    local disks=()
    for dev in /sys/block/*/removable; do
        [[ $(cat "$dev") == "1" ]] || continue  # 仅保留可移动设备
        local disk="/dev/$(basename "$(dirname "$dev")")"
        [[ -b $disk ]] && disks+=("$disk")  # 确保是有效的块设备
    done
    echo "${disks[@]}"
}

# 让用户选择一个设备
select_disk() {
    local disks=("$@")
    while true; do
        echo "可用的可移动磁盘设备："
        lsblk -d "${disks[@]}" -o NAME,RM,SIZE,TYPE,MODEL,SERIAL

        # 提示用户输入设备名称
        echo "请输入设备名称（如 sdb），或直接回车退出："
        read -r disk_name
        [[ -z $disk_name ]] && exit 0

        local selected_disk="/dev/$disk_name"
        for disk in "${disks[@]}"; do
            if [[ $disk == "$selected_disk" ]]; then
                echo "已选择设备：$selected_disk"
                return 0
            fi
        done

        echo "错误：无效的设备名称，请重新输入！"
    done
}

# 主流程
main() {
    local removable_disks
    removable_disks=($(get_removable_disks))

    if [[ ${#removable_disks[@]} -eq 0 ]]; then
        echo "未检测到可移动磁盘设备。"
        exit 1
    fi

    select_disk "${removable_disks[@]}"
}

main
